<!--
  -  您可以更改此项目但请不要删除作者署名谢谢，否则根据中华人民共和国版权法进行处理.
  -  You may change this item but please do not remove the author's signature,
  -  otherwise it will be dealt with according to the Copyright Law of the People's Republic of China.
  -
  -  yangbuyi Copyright (c) https://yby6.com 2024.
  -->

<script setup>
import {signCallback} from '@/aigc/vioce/asrauthentication';
import '@/aigc/vioce/config';
import '@/aigc/vioce/speechrecognizer.js';
import '@/aigc/vioce/webaudiospeechrecognizer.js';
import '@/aigc/vioce/webrecorder.js';
import WebAudioSpeechRecognizer from "@/aigc/vioce/webaudiospeechrecognizer.js";


const {proxy} = getCurrentInstance()

const webAudioSpeechRecognizer = ref(null); // Web 音频语音识别器
const voiceBool = ref(false); // 音频
const stagingText = ref(''); // 暂存结果字符
const resultData = ref(''); // 最终结果
const countdown = ref(0); // 计数器
const time = ref('30'); // 时间
let timer = ref(null);
const isOpen = ref(false)

onMounted(() => {

});

const timerInterval = () => {
  clearTimer();
  timer.value = setInterval(() => {
    countdown.value++;
    if (countdown.value === 30) {
      clearTimer();
      close();
      countdown.value = 0;
    }
  }, 1000);
};

const clearTimer = () => {
  clearInterval(timer.value);
  timer.value = null;
};


// 开启实时音频录入
const openVoice = () => {
  // proxy.$modal.notifySuccess("开启实时音频录入")
  console.log("开启实时音频录入");
  isOpen.value = true;
  countdown.value = 0;

  // 初始化实时语音参数
  const params = {
    signCallback: signCallback, // 签名鉴权回调
    secretid: config.secretId,
    appid: config.appId,
    engine_model_type: '16k_zh', // 引擎模型类型
    voice_format: 1, // 语音编码方式 默认就行
    hotword_id: 'dfc7657e26ee11ef8484525400aec391', // 热词 语音识别经常会出现的词,提前设置可以提高性能
    needvad: 0, // 如果语音分片长度超过60秒，用户需开启 vad（人声检测切分功能） 我们一般最多就三十秒
    filter_dirty: 0, // 是否过滤脏词（目前支持中文普通话引擎）。默认为0。0：不过滤脏词；1：过滤脏词；2：将脏词替换为“ * ”
    filter_modal: 0, // 是否过滤语气词（目前支持中文普通话引擎）。默认为0。0：不过滤语气词；1：部分过滤；2：严格过滤
    filter_punc: 1, // 是否过滤句末的句号（目前支持中文普通话引擎）。默认为0。0：不过滤句末的句号；1：过滤句末的句号
    // 是否进行阿拉伯数字智能转换（目前支持中文普通话引擎）
    // 0：不转换，直接输出中文数字， 1：根据场景智能转换为阿拉伯数字，3: 打开数学相关数字转换。默认值为1
    convert_num_mode: 1,
    // 是否显示词级别时间戳。0：不显示；1：显示，不包含标点时间戳，2：显示，包含标点时间戳。
    // 支持引擎 8k_en、8k_zh、8k_zh_finance、16k_zh、16k_en、16k_ca、16k_zh-TW、16k_ja、16k_wuu-SH，默认为0
    word_info: 2,
    isLog: false, // 是否打印日志
  };
  // 创建 Web 音频语音识别器
  webAudioSpeechRecognizer.value = new WebAudioSpeechRecognizer(params);

  // 计时器
  timerInterval();

  voiceBool.value = true;

  webAudioSpeechRecognizer.value.OnRecognitionStart = (res) => {
  };
  webAudioSpeechRecognizer.value.OnSentenceBegin = (res) => {
  };
  webAudioSpeechRecognizer.value.OnRecognitionResultChange = (res) => {
    //console.log('实时识别开启 : ', res);
    resultData.value = `${stagingText.value}${res.result.voice_text_str}`;
    proxy.$emit('resultSpeechRecognizer', resultData.value, countdown.value);
  };
  webAudioSpeechRecognizer.value.OnSentenceEnd = (res) => {
    //console.log('实时识别结束 : ', res);
    stagingText.value += res.result.voice_text_str;
    resultData.value = stagingText.value;
    proxy.$emit('resultSpeechRecognizer', resultData.value, countdown.value);
    isOpen.value = false;
  };
  webAudioSpeechRecognizer.value.OnRecognitionComplete = (res) => {

  };
  webAudioSpeechRecognizer.value.OnError = (res) => {

  };

  // 开启语音识别
  webAudioSpeechRecognizer.value.start();
};

// 关闭实时音频录入
const close = () => {
  console.log("组件取消");
  if (webAudioSpeechRecognizer.value) {
    webAudioSpeechRecognizer.value.stop();
    webAudioSpeechRecognizer.value = null;
  }
  voiceBool.value = false;
  resultData.value = ''
  stagingText.value = ''
  clearTimer();
  // 录音30秒则强制结束
  if (countdown.value === 30) {
    // proxy.$modal.msgWarning("录音结束")
    countdown.value = 0;
  }
};

defineExpose({
  close, openVoice
})
</script>

<template>
  <div style="margin-top: 5px;margin-bottom: 20px;" v-if="isOpen">
    00:
    <span v-if="countdown < 10">0{{ countdown }}</span>
    <span v-if="countdown >= 10">{{ countdown }}</span> /
    00:{{ time }}
  </div>
</template>

<style scoped lang="scss">

</style>
